﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed
#pragma once

#include "GcmpModelInterface.h"
#include "IElement.h"
#include "OwnerPtr.h"
#include "ElementCreationOptions.h"

namespace gcmp
{
    class IPlane;
    class IGraphicsPlane;
    class IReferencePlane;
    class Coordinate3d;
    /// \brief 工作平面的接口的工具类。
    /// 
    /// 工作平面主要在ModelVeiw中使用，为ModelView提供基准平面。每个视图可以有一个工作平面。
    /// 一个文档还可以有一个全局的工作平面，如果激活全局工作平面，不论切换到那个视图，都使用全
    /// 局工作平面。如在编辑模式下，工作全局工作平面会被激活。
    class GCMP_MODEL_INTERFACE_EXPORT ReferencePlaneUtils
    {
    public:
#pragma region Static
        /// \brief 创建参照平面。
        ///
        /// 通过绘制的起终点，以及工作平面法向量来创建一个参照平面。
        /// \param pDoc 文档指针。
        /// \param startPt 绘制参照平面的起点。
        /// \param endPt 绘制参照平面的终点。
        /// \param directionV 参照平面的V方向，U方向由起点终点决定。
        /// \param eco Element的创建选项
        /// \return 返回一个参照平面的接口指针。
        static IReferencePlane* CreateByPoints(
            IDocument* pDoc,
            const Vector3d& startPt,
            const Vector3d& endPt,
            const Vector3d& directionV,
            ElementCreationOptions eco = ElementCreationOptions::Normal);

        /// \brief 创建参照平面。
        ///
        /// 通过参照平面的原点，UV向，以及可以见范围，创建一个参照平面。可见范围只指定其显示范围。
        /// 参照平面本身是无边界的。
        /// \param pDoc 文档指针。
        /// \param origin 参照平面的原点。
        /// \param dirU 参照平面的U向。
        /// \param dirV 参照平面的V向。
        /// \param visibleUVMin 参照平面的可见UV最小值，代表参照平面显示界限的最小值
        /// \param visibleUVMax 参照平面的可见UV最大值，代表参照平面显示界限的最大值
        /// \param eco Element的创建选项
        /// \return 返回一个参照平面的接口指针。
        static IReferencePlane* CreateByDirections(
            IDocument* pDoc,
            const Vector3d& origin,
            const Vector3d& dirU,
            const Vector3d& dirV,
            const Vector2d& visibleUVMin,
            const Vector2d& visibleUVMax,
            ElementCreationOptions eco = ElementCreationOptions::Normal);

        /// \brief 获取一个平面内可见的所有参照平面。
        ///
        /// 获取一个平面内可见的所有参照平面。
        /// \param pDoc 文档指针。
        /// \param coord 平面所处的坐标系。
        /// \param visibleReferencePlanes 可见的所有参照平面。
        /// \return 如果成功，返回true；否则，返回false。
        static bool GetVisibleReferencePlanes(
            IDocument* pDoc,
            const Coordinate3d& coord,
            std::vector<IReferencePlane*>& visibleReferencePlanes);
#pragma endregion Static
    };
}



